﻿// 135. 最大子序和.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//


#include <iostream>
#include <vector>
#include <algorithm>
#include <deque>
using namespace std;
/*

https://www.acwing.com/problem/content/137/
输入一个长度为 n 的整数序列，从中找出一段长度不超过 m 的连续子序列，使得子序列中所有数的和最大。

注意： 子序列的长度至少是 1。

输入格式
第一行输入两个整数 n,m。

第二行输入 n 个数，代表长度为 n 的整数序列。

同一行数之间用空格隔开。

输出格式
输出一个整数，代表该序列的最大子序和。

数据范围
1≤n,m≤300000
输入样例：
6 4
1 -3 5 1 -2 3
输出样例：
7
*/

const int N = 300010;
int n, m;
int arr[N];
int preSum[N];

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    for (int i = 1; i <= n; i++) {
        preSum[i] = preSum[i - 1] + arr[i];
    }
    deque<int> q; int ans = -0x3f3f3f3f; q.push_back(0);
    for (int i = 1; i <= n; i++) {
        while (!q.empty() && i - q.front() > m) { q.pop_front(); }
        ans = max(ans, preSum[i] - preSum[q.front()]);
        while (!q.empty() && preSum[i] < preSum[q.back()]) { q.pop_back(); }
        q.push_back(i);
    }

    cout << ans << endl;

    return 0;
}


